package Negocio;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import DTO.DTO_Caja;
import DTO.DTO_Factura;
import DTO.DTO_Reserva;
import Entities.Entity_Caja;
import Entities.Entity_Factura;
import Entities.Entity_Reserva;

public class Caja {

	private int cantCupones;
	private int idCaja;
	private Date ultimaFechaCierre;
	private List<Reserva> reservas;
	private Encargado encargado;
	private List<Factura> facturas;
	
	//Constructores
	public Caja(Encargado encargado)
	{
		this.setIdCaja(idCaja);
		this.setEncargado(encargado);
		facturas = new ArrayList<Factura>();
		reservas = new ArrayList<Reserva>();
		cantCupones=0;
	}
	
	public Caja(){
	}
	public Caja(DTO_Caja c){
		this.cantCupones=c.getCantCupones();
		this.idCaja=c.getIdCaja();
		this.ultimaFechaCierre=c.getUltimaFechaCierre();
		List<Reserva> reservas = null;
		for(DTO_Reserva reserva :c.getReservas())
			reservas.add(new Reserva(reserva));
		this.reservas=reservas;
		this.encargado=new Encargado(c.getEncargado());
		List<Factura> facturas = null;
		for(DTO_Factura factura :c.getFacturas())
			facturas.add(new Factura(factura));
		this.facturas=facturas;
		
	}
	
	public Caja(Entity_Caja c){
		this.cantCupones=c.getCantCupones();
		this.idCaja=c.getIdCaja();
		this.ultimaFechaCierre=c.getUltimaFechaCierre();
		List<Reserva> reservas = null;
		for(Entity_Reserva reserva :c.getReservas())
			reservas.add(new Reserva(reserva));
		this.reservas=reservas;
		this.encargado=new Encargado(c.getEncargado());
		List<Factura> facturas = null;
		for(Entity_Factura factura :c.getFacturas())
			facturas.add(new Factura(factura));
		this.facturas=facturas;
		
	}

	//GET & SET
	public int getCantCupones() {
		return cantCupones;
	}
	public void setCantCupones(int cantCupones) {
		this.cantCupones = cantCupones;
	}
	public int getIdCaja() {
		return idCaja;
	}
	public void setIdCaja(int idCaja) {
		this.idCaja = idCaja;
	}
	
	
	public Date getUltimaFechaCierre() {
		return ultimaFechaCierre;
	}
	public void setUltimaFechaCierre(Date ultimaFechaCierre) {
		this.ultimaFechaCierre = ultimaFechaCierre;
	}
	public List<Reserva> getReservas() {
		return reservas;
	}
	public void setReservas(List<Reserva> reservas) {
		this.reservas = reservas;
	}
	public Encargado getEncargado() {
		return encargado;
	}
	public void setEncargado(Encargado encargado) {
		this.encargado = encargado;
	}
	public List<Factura> getFacturas() {
		return facturas;
	}
	public void setFacturas(List<Factura> facturas) {
		this.facturas = facturas;
	}
	
	//METODOS DE NEGOCIO


	public void generarReserva(int cantComensales, Date fecha, Cliente cliente)
	{
//		if(DAO_Cliente.obtenerCliente(cliente.getNombre()).equals(null)) {
//			reservas.add(new Reserva(cantComensales, fecha, new Cliente(cliente.getNombre())));
//			DAO_Cliente.guardarCliente(cliente);
//		}else
//			reservas.add(new Reserva(cantComensales, fecha, DAO_Cliente.obtenerCliente(cliente.getNombre())));
	}
	

	public void generarFactura(Mesa mesa, Date fecha)
	{
		float monto=0;
		List <ItemFactura> itemFacturas= new ArrayList<ItemFactura>();
		for(Pedido pedido: mesa.getPedidos())
			for(ItemPedido itemPedido : pedido.getItemPedidos()) 
			{
				if(itemPedido.getReclamo().equals(null)){
					itemFacturas.add(new ItemFactura(itemPedido.getItemCarta(),itemPedido.getItemCarta().getPrecio()));
					monto = monto + itemPedido.getItemCarta().getPrecio();
				}
			}
				
		facturas.add(new Factura(mesa, itemFacturas, monto, "Pediente de Pago"));
	}

	public DTO_Factura mostrarFactura()
	{
		return new DTO_Factura();
	}
	
	public List<Mozo>  calcularComisiones(List<Mozo> mozos)
	{
		//Quilombo
		List<Mozo> mozosConComisiones = new ArrayList<Mozo>();
		float totalAPagar;
		java.util.Calendar cal = java.util.Calendar.getInstance();
		java.util.Date utilDate = cal.getTime();
		java.sql.Date sqlDate = new Date(utilDate.getTime());
		for(Mozo mozo: mozos)
		{
			totalAPagar=0;
			for(Mesa mesa :mozo.getMesas())
				for(Pedido pedido: mesa.getPedidos())
					for(ItemPedido itemPedido: pedido.getItemPedidos())
					{
						totalAPagar=(totalAPagar+itemPedido.getItemCarta().getProductoVenta().getPorcentajeComision()*itemPedido.getItemCarta().getPrecio());
						totalAPagar=totalAPagar+(itemPedido.getItemCarta().getPrecio()*mozo.getPorcentajeComision());
					}
//			mozo.setComision(new Comision(totalAPagar, sqlDate, encargado));
			mozosConComisiones.add(mozo);
		}
		return mozos;
	}
	void abrirCaja(Encargado e)
	{
		this.setIdCaja(idCaja);
		this.setEncargado(e);
		facturas = new ArrayList<Factura>();
		reservas = new ArrayList<Reserva>();
		cantCupones=0;
	}
	float cierreCaja()
	{
		float montoCierre=0;
		for(Factura factura : facturas)
			montoCierre = montoCierre +factura.getMonto();
		facturas = new ArrayList<Factura>();
		java.util.Calendar cal = java.util.Calendar.getInstance();
		java.util.Date utilDate = cal.getTime();
		java.sql.Date sqlDate = new Date(utilDate.getTime());
		this.setUltimaFechaCierre(sqlDate);
		return montoCierre;
	}
	
//	private int cantCupones;
//	private int idCaja;
//	private Date ultimaFechaCierre;
//	private List<Reserva> reservas;
//	private Encargado encargado;
//	private List<Factura> facturas;
	
	public DTO_Caja toDTO(){
		DTO_Caja c = new DTO_Caja();
		c.setCantCupones(cantCupones);
		c.setEncargado(encargado.toDTO());
		List<DTO_Factura> facts = new ArrayList<DTO_Factura>();
		for(Factura fact : facturas)
			facts.add(fact.toDTO());
		c.setFacturas(facts);
		return c;
	}
	
	public Entity_Caja toEntity(){
		Entity_Caja c = new Entity_Caja();
		c.setCantCupones(cantCupones);
		c.setEncargado(encargado.toEntity());
		List<Entity_Factura> facts = new ArrayList<Entity_Factura>();
		for(Factura fact : facturas)
			facts.add(fact.toEntity());
		c.setFacturas(facts);
		return c;
	}

}